package org.lzy.shop.network

import android.content.Context
import android.util.Log
import io.ktor.client.HttpClient
import io.ktor.client.engine.android.Android
import io.ktor.client.plugins.HttpRequestRetry
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.logging.Logger
import io.ktor.client.plugins.logging.Logging
import io.ktor.http.HttpStatusCode
import io.ktor.serialization.gson.gson
import kotlinx.io.IOException
import kotlinx.serialization.Serializable
import org.lzy.shop.BuildConfig
import org.lzy.shop.Constant

object KtorClient {
    // 创建并配置HttpClient
    fun create(context: Context): HttpClient {
        return HttpClient(Android) {
            // 日志配置
            install(Logging) {
                logger = object : Logger {
                    override fun log(message: String) {
                        Log.d("Ktor", message)
                    }
                }


            }

            // 内容协商（用于JSON解析）
            install(ContentNegotiation) {
                gson {
                    // 移除不必要的格式化，提高性能
                    // setPrettyPrinting() 仅在调试时使用
                    if (!BuildConfig.DEBUG) {
                        serializeNulls()
                    }
                }
            }

            // 请求重试配置
            install(HttpRequestRetry) {
                maxRetries = 2
                retryIf { request, response ->
                    // 对特定错误码进行重试，包括401未授权（token过期）
                    // 仅对服务器错误和未授权错误重试
                    response.status.value in 500..599 || response.status == HttpStatusCode.Unauthorized
                }
                retryOnExceptionIf { request, cause ->
                    // 仅对网络异常重试，避免对所有异常都重试
                    cause is IOException
                }
                delayMillis { retry ->
                    // 指数退避策略
                    (retry * 1000L)
                }
            }


            //简化defaultRequest
            defaultRequest {
                url(Constant.BASE_URL)
            }

            install(HttpTimeout) {
                requestTimeoutMillis = 15000 // 增加请求超时时间到15秒
                connectTimeoutMillis = 5000 // 连接超时5秒
                socketTimeoutMillis = 20000 // 套接字超时20秒
            }
            // 添加保持活跃配置，减少连接建立开销
            engine {
                connectTimeout = 5000
                socketTimeout = 20000

            }
        }

    }

}

// 定义刷新token请求和响应的数据类
@Serializable
data class RefreshTokenRequest(
    val refreshToken: String?
)

@Serializable
data class RefreshTokenResponse(
    val token: String,
    val expire: String,
    val refreshToken: String,
    val refreshExpire: String

)
